/*
Copyright [2012] [Maria Eugenia Malagamba]
Copyright [2012] [Leandro Pellegrino]
Copyright [2012] [Julia Gambuzzi]
Copyright [2012] [Ignacio Capodanno]

   Licensed under the Apache License, Version 2.0 (the "License");
   you may not use this file except in compliance with the License.
   You may obtain a copy of the License at

       http://www.apache.org/licenses/LICENSE-2.0

   Unless required by applicable law or agreed to in writing, software
   distributed under the License is distributed on an "AS IS" BASIS,
   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
   See the License for the specific language governing permissions and
   limitations under the License.
*/

#include "Jugador.h"

Jugador::Jugador(Nave* nave, int anchoTablero, int altoTablero, string nombre, int numeroNave, int numero){

	this->nave = nave;
	this->nombre = nombre;
	int ancho = 80; 
	int alto = 150;
	double posX, posY, angulo;
	if (numero == 1){
		angulo = 0;
		posX = 0 ;
		posY = altoTablero/ 2 - ancho;

	}else {
		angulo = 180;
		posX = anchoTablero - ancho ;
		posY = altoTablero/ 2 - ancho;
	}

	stringstream  nombreBase;
	nombreBase<<"base"<<numeroNave<<".bmp";
	this->base = new Base(nombre,posX , posY, nombreBase.str(),ancho , alto, angulo);
	

	this->bonusObtenidos = new vector<Bonus*>;
	//Bonus* bonus =  new Bonus(MISIL,"Arma",5, "Misil_Icono.bmp",30,20);
	//Bonus* bonus2 =  new Bonus(MINA,"Arma",3, "Mina_Icono.bmp",20,20);
	//Bonus* bonus3 =  new Bonus(BOMBA,"Arma",10, "Bomba_Icono.bmp",20,20);
	//Bonus* bonus4 = new Bonus(NEUTRONES,"Arma",3,"BombaNeutrones_Icono.bmp",20,20);
	//this->agregarBonus(bonus);
	//this->agregarBonus(bonus2);
	//this->agregarBonus(bonus3);
	//this->agregarBonus(bonus4);

	this->cantidadVidas = 3;
	this->estadoJugadorEnJuego = JUGANDO;

}

vector<Bonus*>* Jugador::getBonusObtenidos(){
	return this->bonusObtenidos;
}


Base* Jugador::getBase(){
	return this->base;
}

Nave* Jugador::getNave(){
	return this->nave;
}

int Jugador::getCantidadDeVidas(){
	return this->cantidadVidas;
}

void Jugador::setCantidadDeVidas(int vidas){
	this->cantidadVidas = vidas;
}

void Jugador::setNombre(string nombre){
	this->nombre = nombre;
}

string Jugador::getNombre(){
	return this->nombre;
}

void Jugador::disminuirVida(){
	this->cantidadVidas--;
	if(this->cantidadVidas == 0){
		this->setEstadoJugadorEnJuego(GAME_OVER);
	}

}

void Jugador::setEstadoJugadorEnJuego(estados_juego estado){
	this->estadoJugadorEnJuego = estado;
}
estados_juego Jugador::getEstadoJugadorEnJuego(){
	return this->estadoJugadorEnJuego;
}

//Busca el bonus si lo encuentra disminuye en uno la cantidad
//Si es el ultimo que le quedaba lo borra del vector
bool Jugador::buscarBonus(bonus_disponibles clave){

	for (unsigned int i = 0; i < this->bonusObtenidos->size(); i++) {
		if(this->bonusObtenidos->at(i)->getNombre() == clave){
			this->bonusObtenidos->at(i)->disminuir();
			if (this->bonusObtenidos->at(i)->getCantidadDisponible() == 0 || this->bonusObtenidos->at(i)->getCantidadDisponible() == 99 ){
				Bonus* aborrar = this->bonusObtenidos->at(i);
				this->bonusObtenidos->erase(this->bonusObtenidos->begin()+i);
				delete aborrar;
			}
			return true;
		}
	}
	return false;
}

bool Jugador::tieneBonus(bonus_disponibles nombre){
	for(unsigned int i = 0; i < this->getBonusObtenidos()->size(); i++){
		if (this->bonusObtenidos->at(i)->getNombre() == nombre){
			return true;
		}
	}
	return false;
}


//Agrega el bonus al vector, si ya existia renueva la cantidad o no hace nada
bool Jugador::agregarBonus(Bonus* nuevoBonus){
	
	// los bonus de tipo defensa no se acumulan, son "instantáneos"
	if (nuevoBonus->getTipo() == "Defensa"){
		if (nuevoBonus->getNombre() == bonus_disponibles::ESCUDO){
			this->getNave()->agregarEscudo();
		}
		if (nuevoBonus->getNombre() == bonus_disponibles::SUPERESCUDO){
			this->getNave()->agregarSuperEscudo();
		}
	}

	bool yaFueAgregado = false;
	for (unsigned int i = 0; i < this->bonusObtenidos->size(); i++) {
		if(this->bonusObtenidos->at(i)->getNombre() == nuevoBonus->getNombre()){
			this->bonusObtenidos->at(i)->setCantidadDisponible(nuevoBonus->getCantidadDisponible());
			delete nuevoBonus;
			yaFueAgregado = true;	
		}
	}
	if(!yaFueAgregado){
		this->bonusObtenidos->push_back(nuevoBonus);
	}

	return yaFueAgregado;
}

void Jugador::pintarBonus(SDL_Surface* pantalla){
	
	int cantidad;
	double posX = 15;
	double posY = 15;
	for (unsigned int i = 0; i < this->bonusObtenidos->size(); i ++ ){

		if( this->bonusObtenidos->at(i)->getCantidadDisponible() == 99)
			cantidad = 1;
		else
			cantidad = this->bonusObtenidos->at(i)->getCantidadDisponible();

		for (unsigned int j = 0; j < cantidad; j++){
			this->bonusObtenidos->at(i)->setPosicionX(posX);
			this->bonusObtenidos->at(i)->setPosicionY(posY);
 			this->bonusObtenidos->at(i)->pintarImagen(pantalla);
			posX += this->bonusObtenidos->at(i)->getAnchoDeLaImagen() + 3;

		}
	}
}


void Jugador::revivirNave(){
	this->getNave()->revivite();
}

void Jugador::eliminarBonus(vector<bonus_disponibles>* &bonusUsados){

	for (unsigned int i = 0; i < this->bonusObtenidos->size(); i++) {
		if (this->bonusObtenidos->at(i)->getCantidadDisponible() != 99){
			for(int j = 0; j < this->bonusObtenidos->at(i)->getCantidadDisponible(); j++){
				bonusUsados->push_back(this->bonusObtenidos->at(i)->getNombre());
			}
			delete this->bonusObtenidos->at(i);
		}else{
			bonusUsados->push_back(this->bonusObtenidos->at(i)->getNombre());
			delete this->bonusObtenidos->at(i);
		}
	}
	delete this->bonusObtenidos;
	this->bonusObtenidos = new vector<Bonus*>;
}

void Jugador::morite(){
	this->cantidadVidas = 0;
	this->setEstadoJugadorEnJuego(GAME_OVER);
}

void Jugador::chequearInvisibilidad(){
	Nave* nave = this->getNave();
	if(this->tieneBonus(INVISIBILIDAD) && nave->getCiclosInvisible() < nave->getCiclosBonusInvisibilidad()){
  		nave->setInvisible(true);
		nave->incrementarCiclosInvisible();
	}else if(nave->esInvisible() && nave->getCiclosInvisible() == 200){
		nave->setInvisible(false);
		nave->resetCiclosInvisible();
		this->buscarBonus(INVISIBILIDAD);
	}
}


Jugador::~Jugador(void)
{
	for (unsigned int i = 0; i < this->bonusObtenidos->size(); i++) {
		delete this->bonusObtenidos->at(i);
    }

	delete this->bonusObtenidos;

	//delete this->base;
}
